package com.czk.rdd.persist

import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author:ChenZhangKun
 * @Date: 2021/12/13 10:08
 */
object PersisitDemo1 {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val sc = new SparkContext(sparkConf)
    val list = List("hello scala", "hello, spark")

    val rdd = sc.makeRDD(list)

    val flatRDD = rdd.flatMap(_.split(" "))
    // map可以执行持久化操作
    val mapRDD = flatRDD.map((_, 1))
    // 将数据缓存在内存中
    // 默认将数据保存在内存中
    // mapRDD.cache()
    // 需要保存在文件中
    // 持久化操作必须在行动算子执行时执行的
    // 在前面执行数据很长，也可也可以采用持久化操作
    mapRDD.persist(StorageLevel.DISK_ONLY)
    val reduceRDD = mapRDD.reduceByKey(_ + _)
    // rdd中是不存储数据的，如果一个rdd被重用，会从头再次来执行获取数据
    // RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存，默认情况下会把数据以缓存
    // 在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存，而是触发后面的 action 算 子时，该 RDD 将会被缓存在计算节点的内存中，
    // 所有对象重用的意义并不大

    reduceRDD.collect().foreach(println)
  }
}
